import asyncio
import json
from logging import exception
from typing import List

from django.core.files.uploadedfile import InMemoryUploadedFile
from langchain_core.documents import Document
from rest_framework.views import APIView
from HomeAutoAI.common.Results import HttpResult
from HomeAutoAI.common.utils.ThreadLocal import get_cur_user
from llm.entity.vo.FIleUploadVO import FileUploadVO

from llm.service.FileService import FileService

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings

from users.models import Users


class FileUploadView(APIView):
    def post(self, request):
        """
        统一文件上传接口，将含有多个设备控制信息的配置文件解析为不同的json对象作为文档保存，返回一个本地Chroma向量数据库的id list。和其他接口组合使用实现不同的上传场景
        上传的文件统一存储到作为缓存区的数据库中，在用户添加配置时，将所提供的file ids所对应的文档存储到用户关联的指定的chroma数据库集合空间中
        :param request:
        :return:
        """
        user: Users = get_cur_user()
        try:
            files: List[InMemoryUploadedFile] = request.FILES.getlist("files")
            print(f"2:+{files}")
            if len(files) == 0:
                return HttpResult.error(message="上传文件不能为空")
            file_ids: list[str] = FileService.upload_files_to_chroma(
                files=files,
                user=user
            )
            fileVO = FileUploadVO(
                file_ids=file_ids,
                file_num=len(file_ids)
            )
            return HttpResult.success(
                data=fileVO.dict(),
                message="上传成功"
            )
        except Exception as e:
            return HttpResult.error(message=str(e))
